package com.jpxx.mina.sendmessage;

import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;

import com.jpxx.mina.SmsObject;

//在Mina 中编写编码器 extend ProtocolEncoderAdapter
public class CmccSipcEncoder extends ProtocolEncoderAdapter {
	private final Charset charset;

	public CmccSipcEncoder(Charset charset) {
		this.charset = charset;
	}

	@Override
	public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
		//将 encode()方法中的message 对象强制转换为指定的对象类型；
		SmsObject sms = (SmsObject) message;
		CharsetEncoder ce = charset.newEncoder();
		//创建IoBuffer 缓冲区对象，并设置为自动扩展
		IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true);

		String statusLine = "M sip:wap.fetion.com.cn SIP-C/2.0";
		String sender = sms.getSender();
		String receiver = sms.getReceiver();
		String smsContent = sms.getMessage();
		System.out.println("smsContent"+smsContent);
		//将转换后的message 对象中的各个部分按照指定的应用层协议进行组装，并put()到IoBuffer 缓冲区；
		buffer.putString(statusLine + '\n', ce);
		buffer.putString("S: " + sender + '\n', ce);
		buffer.putString("R: " + receiver + '\n', ce);
		//长度
		buffer.putString("L: " + (smsContent.getBytes(charset).length) + "\n", ce);
		buffer.putString(smsContent, ce);
//		当你组装数据完毕之后，调用flip()方法，为输出做好准备，切记在write()方法之前，
//		要调用IoBuffer 的flip()方法，否则缓冲区的position 的后面是没有数据可以用来输出的，
//		你必须调用flip()方法将position 移至0，limit 移至刚才的position。这个flip()方法的含义请参看java.nio.ByteBuffer。
		buffer.flip();
//		最后调用ProtocolEncoderOutput 的write()方法输出IoBuffer 缓冲区实例。
		out.write(buffer);
	}
}